#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
备份程序打包脚本
使用PyInstaller将main.py打包成单文件exe
"""

import os
import sys
import subprocess
from pathlib import Path

def build_exe():
    """
    使用PyInstaller打包程序
    """
    print("🚀 开始打包备份程序...")
    
    # 获取当前目录
    current_dir = Path(__file__).parent
    main_py = current_dir / "main.py"
    tasklist_dir = current_dir / "tasklist"
    
    if not main_py.exists():
        print("❌ 错误: 找不到main.py文件")
        return False
    
    # PyInstaller命令参数
    cmd = [
        "pyinstaller",
        "--onefile",  # 打包成单文件
        "--console",  # 保留控制台窗口
        "--name=BackupScheduler",  # 可执行文件名称
        "--distpath=dist",  # 输出目录
        "--workpath=build",  # 临时文件目录
        "--specpath=.",  # spec文件位置
        "--clean",  # 清理临时文件
        "--noconfirm",  # 不询问覆盖
        str(main_py)
    ]
    
    # 如果tasklist目录存在，将其包含到打包中
    if tasklist_dir.exists():
        cmd.extend(["--add-data", f"{tasklist_dir};tasklist"])
        print(f"📁 包含任务列表目录: {tasklist_dir}")
    
    print(f"📦 执行打包命令: {' '.join(cmd)}")
    
    try:
        # 执行PyInstaller命令
        result = subprocess.run(cmd, check=True, capture_output=True, text=True, encoding='utf-8')
        print("✅ 打包成功!")
        
        # 检查输出文件
        exe_path = current_dir / "dist" / "BackupScheduler.exe"
        if exe_path.exists():
            file_size = exe_path.stat().st_size / (1024 * 1024)  # MB
            print(f"📄 可执行文件: {exe_path}")
            print(f"📊 文件大小: {file_size:.2f} MB")
            print("\n🎉 打包完成! 可执行文件位于 dist/BackupScheduler.exe")
            print("\n📋 使用说明:")
            print("1. 将BackupScheduler.exe复制到目标位置")
            print("2. 在同一目录下创建tasklist文件夹")
            print("3. 在tasklist文件夹中放置.txt格式的任务配置文件")
            print("4. 双击运行BackupScheduler.exe")
            return True
        else:
            print("❌ 错误: 未找到生成的可执行文件")
            return False
            
    except subprocess.CalledProcessError as e:
        print(f"❌ 打包失败: {e}")
        if e.stdout:
            print(f"标准输出: {e.stdout}")
        if e.stderr:
            print(f"错误输出: {e.stderr}")
        return False
    except Exception as e:
        print(f"❌ 打包过程中发生错误: {e}")
        return False

def install_pyinstaller():
    """
    安装PyInstaller
    """
    print("📦 检查PyInstaller...")
    try:
        import PyInstaller
        print("✅ PyInstaller已安装")
        return True
    except ImportError:
        print("📥 正在安装PyInstaller...")
        try:
            subprocess.run([sys.executable, "-m", "pip", "install", "pyinstaller"], check=True)
            print("✅ PyInstaller安装成功")
            return True
        except subprocess.CalledProcessError as e:
            print(f"❌ PyInstaller安装失败: {e}")
            return False

def main():
    """
    主函数
    """
    print("=" * 60)
    print("🔧 备份程序打包工具")
    print("=" * 60)
    
    # 检查并安装PyInstaller
    if not install_pyinstaller():
        return
    
    # 执行打包
    if build_exe():
        print("\n🎊 所有操作完成!")
    else:
        print("\n💥 打包失败，请检查错误信息")

if __name__ == "__main__":
    main()